//
//  RacTestViewController.m
//  ObjcGoNew
//
//  Created by 邢伟新 on 2021/5/21.
//

#import "RacTestViewController.h"
#import <ReactiveObjC/ReactiveObjC.h>
#import <ReactiveObjC/RACReturnSignal.h>
#import <Masonry/Masonry.h>



@interface RacTestViewController ()
@property(nonatomic,strong)UITextField *textField;
@end

@implementation RacTestViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

   
    
    self.title = @"rac";
    self.view.backgroundColor = [UIColor whiteColor];
    [self _initTextfield];
    
  
    [self _distinctUntilChanged];
}

-(void)_initTextfield{
    
    self.textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 100, 200, 50)];
    self.textField.backgroundColor = [UIColor systemBlueColor];
    [self.view addSubview:self.textField];
    
    UIButton *barrierButton = [UIButton buttonWithType:(UIButtonTypeCustom)];
    [barrierButton setTitle:@"修改textField的值" forState:(UIControlStateNormal)];
//    [barrierButton addTarget:self action:@selector(barrierAction:) forControlEvents:(UIControlEventTouchUpInside)];
    barrierButton.backgroundColor =[UIColor purpleColor];
    barrierButton.tag = 1001;
    [self.view addSubview:barrierButton];
    [barrierButton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(15);
        make.right.mas_equalTo(-15);
        make.height.mas_equalTo(50);
        make.bottom.mas_equalTo(-150);
    }];
    [[barrierButton rac_signalForControlEvents:(UIControlEventTouchUpInside)]subscribeNext:^(__kindof UIControl * _Nullable x) {
            
        self.textField.text = @"xingweixn";
    }];
    
}


//冷信号
-(void)_initSignal{
    
    //创建信号
    RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        
        //发送信号
        [subscriber sendNext:@"1"];
        [subscriber sendNext:@"2"];
        
        return [RACDisposable disposableWithBlock:^{
            //信号销毁
            NSLog(@"--信号销毁");
        }];
        
    }];
    
    //订阅信号
    [signal1 subscribeNext:^(id  _Nullable x) {
        NSLog(@"----传来的信号为%@",x);
    }];
    
    
}

//热信号
-(void)_initSubject{
    //创建信号
    RACSubject *subject = [RACSubject subject];
    
    //订阅信号
    [subject subscribeNext:^(id  _Nullable x) {
        NSLog(@"----传来的信号为%@",x);
    }];
    
    //发送信号
    [subject sendNext:@"1"];
    [subject sendNext:@"2"];
    [subject sendNext:@"3"];
    [subject sendCompleted];
    
    
    
}

//bind是包装信号
-(void)_bind{
    //    //创建信号
       RACSubject *subject = [RACSubject subject];
      //绑定新的信号
      RACSignal *singnal=[subject bind:^RACSignalBindBlock _Nonnull {
          return ^RACSignal*(id value,BOOL *stop){
              NSLog(@"value---%@",value);
              NSLog(@"stop---%@",[NSNumber numberWithBool:stop]);
              
              return[RACReturnSignal return:value];
          };
      }];
      // 订阅信号
      [singnal subscribeNext:^(id  _Nullable x) {
          NSLog(@"bind x is [%@]",x);
      }];
      //发送信号
      [subject sendNext:@"send bind value 123"];

}

//bind是包装信号
-(void)_bind1{
    
    [[self.textField.rac_textSignal bind:^RACSignalBindBlock {
            return ^RACSignal*(id value,BOOL *stop){
                return [RACReturnSignal return:[NSString stringWithFormat:@"hello: %@",value]];
            };
    }] subscribeNext:^(id  _Nullable x) {
         
        //包装信号
        
        NSLog(@"包装后的输出为-----%@",x);
    }];
    
}


//concat 合并多个信号为1个信号,其中前一个信号必须sendCompleted后一个才会执行后一个
-(void)_concat{
    RACSubject *sub1 = [RACSubject subject];
    RACSubject *sub2 = [RACSubject subject];
    RACSignal *signal = [sub1 concat:sub2];
    
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"输出为-----%@",x);
    }];
    
    [sub1 sendNext:@"1"];
    [sub1 sendCompleted];
    [sub2 sendNext:@"2"];
   
    
}

//合并,与concat不同的是不需要前一个执行sendCompleted后边的才能执行,只要有一个信号来就执行合并操作,没有顺序
-(void)_merge{
    RACSubject *sub1 = [RACSubject subject];
    RACSubject *sub2 = [RACSubject subject];
    RACSignal *signal = [sub1 merge:sub2];
    
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"输出为-----%@",x);
    }];
    
    [sub1 sendNext:@"1"];
    [sub2 sendNext:@"2"];
    
}

//合并最新元素的数组会输出多次
-(void)_combineLatest{
    
    RACSubject *sub1 = [RACSubject subject];
    RACSubject *sub2 = [RACSubject subject];
    RACSignal *signal = [RACSignal combineLatest:@[sub1,sub2]];
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"输出的元祖为--%@",x);
    }];
    [sub1 sendNext:@"a"];
    [sub2 sendNext:@"b"];
    [sub2 sendNext:@"B"];
    [sub1 sendNext:@"A"];
    
    /*
     2021-05-21 15:27:29.446570+0800 ObjcGoNew[10400:801952] 输出的元祖为--<RACTuple: 0x283c51290> (
         a,
         b
     )
     2021-05-21 15:27:29.446841+0800 ObjcGoNew[10400:801952] 输出的元祖为--<RACTuple: 0x283c51380> (
         a,
         B
     )
     2021-05-21 15:27:29.446947+0800 ObjcGoNew[10400:801952] 输出的元祖为--<RACTuple: 0x283c51530> (
         A,
         B
     )
     */
    
}


//reduce 用来处理元祖数据
-(void)reduce{
    
    
    RACSubject *sub1 = [RACSubject subject];
    RACSubject *sub2 = [RACSubject subject];
//    RACSignal *signal = [RACSignal combineLatest:@[sub1,sub2] ];
    RACSignal *signal = [RACSignal combineLatest:@[sub1,sub2] reduce:^id _Nonnull(NSString *string1,NSString *string2){
        
        return [NSString stringWithFormat:@"%@-%@",string1,string2];
    }];
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"输出的为--%@",x);
    }];
    [sub1 sendNext:@"a"];
    [sub2 sendNext:@"b"];
    [sub2 sendNext:@"B"];
    [sub1 sendNext:@"A"];
}


//flattenMap 底层使用bind实现
-(void)_flattenMap{
    
    
    RACSubject *sub1 = [RACSubject subject];
    RACSignal *subject2 = [sub1 flattenMap:^__kindof RACSignal * _Nullable(id  _Nullable value) {
        return  [RACReturnSignal return:[NSString stringWithFormat:@"hello: %@",value]];
        
    }];
    
    [subject2 subscribeNext:^(id  _Nullable x) {
        
        NSLog(@"输出的为--%@",x);
    }];
    
    [sub1 sendNext:@"123"];
    
}

//map 的底层实现是通过flattenMap 实现的。map 直接对数据进行处理，并且返回处理后的数据
-(void)_map{
    
    [[self.textField.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
            // 当源信号发出，就会调用这个block，修改源信号的内容
            // 返回值：就是处理完源信号的内容。
            return [NSString stringWithFormat:@"hello : %@",value];
        }] subscribeNext:^(id  _Nullable x) {
            NSLog(@"Map : %@",x); // hello: "x"
        }];
}

//过滤
-(void)_filter{
    RACSubject *subject = [RACSubject subject];
    
    RACSignal *signal = [subject filter:^BOOL(id  _Nullable value) {
        NSString *string = (NSString *)value;
        if (string.length > 10) {
            return YES;
        }else{
            return NO;
        }
    }];
    
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"输出的为--%@",x);
    }];
    
    [subject sendNext:@"112"];
    [subject sendNext:@"123456789011"];
}

//屏蔽
-(void)_ignore{
    
    RACSubject *subject = [RACSubject subject];
    
    RACSignal *signal = [subject ignore:@"ABC"];
    
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"输出的为--%@",x);
    }];
    
    [subject sendNext:@"ABC"];
    [subject sendNext:@"ABC123"];
    [subject sendNext:@"123456789011"];
    
    /*
     2021-05-21 16:02:50.183235+0800 ObjcGoNew[10547:812550] 输出的为--ABC123
     2021-05-21 16:02:50.183488+0800 ObjcGoNew[10547:812550] 输出的为--123456789011
     */
}

//then忽略前一个发送的值,前一个必须sendCompleted,后后面的值才输出
-(void)_then{
    
    RACSubject *sub1 = [RACSubject subject];
    RACSubject *sub2 = [RACSubject subject];

    RACSignal *signal = [sub1 then:^RACSignal * _Nonnull{
        return sub2;
    }];
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"输出的为--%@",x);
    }];
    [sub1 sendNext:@"a"];
    [sub1 sendCompleted];
    [sub2 sendNext:@"b"];
    [sub2 sendNext:@"B"];
    
    /*
     2021-05-21 16:10:52.419816+0800 ObjcGoNew[10580:814837] 输出的为--b
     2021-05-21 16:10:52.420049+0800 ObjcGoNew[10580:814837] 输出的为--B
     */
   
    
}

//take 只要前几个信号 比如我只要1-4个
-(void)_take{
    
    
    RACSubject *sub1 = [RACSubject subject];
   
    //获取1-4次的信号, 输入0则不取信号
    RACSignal *signal = [sub1 take:4];
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"输出的为--%@",x);
    }];
    [sub1 sendNext:@"1"];
    [sub1 sendNext:@"2"];
    [sub1 sendNext:@"3"];
    [sub1 sendNext:@"4"];
    [sub1 sendNext:@"5"];
    [sub1 sendNext:@"6"];
    [sub1 sendNext:@"7"];
    
    /*
     2021-05-21 16:16:06.600422+0800 ObjcGoNew[10600:816596] 输出的为--1
     2021-05-21 16:16:06.600766+0800 ObjcGoNew[10600:816596] 输出的为--2
     2021-05-21 16:16:06.600882+0800 ObjcGoNew[10600:816596] 输出的为--3
     2021-05-21 16:16:06.601014+0800 ObjcGoNew[10600:816596] 输出的为--4
     */
}

//skip跳过1-3的信号
-(void)_skip{
    
    RACSubject *sub1 = [RACSubject subject];
    RACSignal *signal = [sub1 skip:3];
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"输出的为--%@",x);
    }];
    [sub1 sendNext:@"1"];
    [sub1 sendNext:@"2"];
    [sub1 sendNext:@"3"];
    [sub1 sendNext:@"4"];
    [sub1 sendNext:@"5"];
    [sub1 sendNext:@"6"];
    [sub1 sendNext:@"7"];
    
    /*
     2021-05-21 16:18:00.002219+0800 ObjcGoNew[10610:817558] 输出的为--4
     2021-05-21 16:18:00.002480+0800 ObjcGoNew[10610:817558] 输出的为--5
     2021-05-21 16:18:00.002588+0800 ObjcGoNew[10610:817558] 输出的为--6
     2021-05-21 16:18:00.002687+0800 ObjcGoNew[10610:817558] 输出的为--7
     */
}

//信号内的信号,获取信号内发送的最新信号,当发送多个内部信号的时候,只接受最新的内部信号
-(void)_switchToLatest{
    RACSubject *sub1 = [RACSubject subject];
    RACSubject *sub2 = [RACSubject subject];
    RACSubject *sub3 = [RACSubject subject];
    
    [sub1.switchToLatest subscribeNext:^(id  _Nullable x) {
        NSLog(@"输出的为--%@",x);
    }];
    
    [sub1 sendNext:sub3];
    [sub1 sendNext:sub2];
    [sub2 sendNext:@"1"];
    [sub2 sendNext:@"2"];
    [sub3 sendNext:@"3"];
    [sub3 sendNext:@"4"];
    [sub2 sendNext:@"5"];
    
    /*
     2021-05-21 16:27:23.053965+0800 ObjcGoNew[10651:820644] 输出的为--1
     2021-05-21 16:27:23.054141+0800 ObjcGoNew[10651:820644] 输出的为--2
     2021-05-21 16:27:23.054189+0800 ObjcGoNew[10651:820644] 输出的为--5
     */
    
}


//忽略重复的信号
-(void)_distinctUntilChanged{
    
    RACSubject *sub1 = [RACSubject subject];
    [sub1.distinctUntilChanged subscribeNext:^(id  _Nullable x) {
        NSLog(@"输出的为--%@",x);
    }];
    
    [sub1 sendNext:@"1"];
    [sub1 sendNext:@"1"];
    [sub1 sendNext:@"1"];
    [sub1 sendNext:@"2"];
    
    
    /*
     2021-05-21 16:31:39.072997+0800 ObjcGoNew[10667:821706] 输出的为--1
     2021-05-21 16:31:39.073593+0800 ObjcGoNew[10667:821706] 输出的为--2
     */
    
}

@end
